home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
libs
/
knowhow4
/
vectappl.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1994-11-04
|
14KB
|
452 lines
// See Vector.h
#include "vector.h" // Vector class
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "global.h" // Global variables
#include <dos.h>
enum { SAVE = 1, DONT_SAVE }; // picture status
enum { FILE_NEW = 30, FILE_OPEN, FILE_SAVE, FILE_SAVE_AS_PCX,
FILE_SAVE_AS_PCX_BW,
SCRIPT_PLAY, SCRIPT_RECORD, SCRIPT_END, MACROS_KEEP, TEXT_EDIT };
/////////////////////////////////////////////////////////////////////////////
//------> The following part is common for programs with SCRIPTS <---------\\
void file_refresh() // Used to get previous script name from stack
{ // Scripts and macroses could (with some
scriptMode = GO; // Limitations) be nested.
delete scriptFileName;
scriptFileName = NULL;
mac_status mac = macros_pop(); // Obtain previous status
delete mac.file;
}
//------> The above part is common for programs with SCRIPTS <-------\\
/////////////////////////////////////////////////////////////////////////////
void Vector::to_buffer()
{
int maxx = getmaxx();
int maxy = getmaxy() - 16;
int x_screens = setup->w % maxx
? setup->w / maxx + 1 : setup->w / maxx;
int y_screens = setup->h % maxy
? setup->h / maxy + 1 : setup->h / maxy;
int width = x_screens * maxx + 20;
int height = y_screens * maxy + 20;
buffer = new GrafBuffer(loc(width, height), "_work.buf",
rect(0, 0, maxx, maxy + 15));
buffer->b_open();
buffer->clear();
int shift_x = 0;
int shift_y = 0; // loc buf_dim = buffer->get_dim();
for(int i = 0; i < x_screens && !vector->get_error(); i++)
{
for(int j = 0; j < y_screens && !vector->get_error(); j++)
{
if(i || j)
vector->show();
buffer->screen_buffer(); // Copy visible part of screen
shift_y += (long)maxy;// * 100 / vector->get_add_zoom().Y;
vector->set_add_scroll(shift_x, shift_y);
buffer->scroll(maxy, UP, 0);
}
buffer->scroll(maxy * (j - 1), DN, 0);
shift_y = 0;
shift_x += (long)maxx / 8 * 8;// * 100 / vector->get_add_zoom().X;
vector->set_add_scroll(shift_x, shift_y);
buffer->scroll(maxx / 8 * 8, LEFT, 0);
}
vector->set_add_scroll(0, 0);
}
///////////////////////////
void Vector::reload()
{
while(vector->play_used != 0)
delete vector->playpop();
delete vector->program;
vector->error = 0;
vector->set_program(vector->load_program(editor->getFileName()));
}
///////////////////////////
// Prepare file system. Not necessary but strongly reckomended.
void Vector::prepare_files()
{
delete global[1]; delete global[2];
global[1] = strdup("work"); global[2] = strdup("");
(file_sys->file_system)->setItems();
}
/////////////////////////////////////////////////////////////////////////////
// Board (window with PCX in it) is displayed and the simple movie is
// runned in it. Icons with few fazes of demo are showed one after another.
void about()
{
Board* board = new Board(rect(5, 5, 65, 20), "about.pcz",
"about.pcy", "A B O U T", 8, 0, 16);
board->show_window();
Icon i(loc(1, 1), 2, LARGE_ICON, SHOW_BORDER);
char* file = i.icon_open();
FILE *stream;
if((stream = fopen(file, "r+b")) == NULL)
return;
loc size = icon_size(LARGE_ICON);
int i_size = ((size.X + 1 + 7) >> 3 << 2) * (size.Y + 1) + sizeof(imageP);
imageP image = (imageP)malloc(i_size + 10);
while(1)
{
for(int j = 1; j < 17; j++)
{
get_image(stream, j, image, i_size);
putimage(screenXL(8), screenYT(10), image, COPY_PUT);
delay(20);
if(eventavail(KEYEVENT | MOUSEEVENT,
MCleftDn | MCrightDn))
break;
}
if(eventavail(KEYEVENT | MOUSEEVENT,
MCleftDn | MCrightDn))
break;
}
get_event();
fclose(stream);
delete image;
board->hide();
delete board;
}
/////////////////////////////////////////////////////////////////////////////
// User-defined functions. It is good idea to write all functions, even
// it they do nothing but only passes the control from one menu to another.
// To know more about this topic see discussion about Simplified User
// Interface in KNOW_HOW.TXT.
int Vector::application(int n)
{
rect r = vector->user_screen(); // If Block_KH_OOPic used, use
// (vector->vector->)user_screen()
loc mspos = e.where(); // Mouse position
sound(100); delay(100); nosound(); // I want some beeps
switch(n)
{
// case AC_MOVE: // We do not support MOVE and RESIZE
// global_i[0] = AC_MOVE; // in this simple application.
// return 0; // But it is not difficult to do.
// case AC_RESIZE: // Use KNOW-HOW.DRAW as the example.
// global_i[0] = AC_RESIZE;
// return 0;
case AC_FILE_MENU: // Go from line menu to the corresponding
case AC_SCRIPT_MENU: // objects. We only pass the control here.
return 2; // Call the next menu.
case AC_BUFFER_MENU: // Call for Options menu
return 2;
case AC_BUFFER:
return 1;
case AC_PRINT_MENU: // Pass the control to the Printer setup
return 2; // form.
case AC_PRINT: // Print to printer. To be changed.
editor->swap();
reload();
WindowManager::hide_window(); // Print form
rect tmp = vector->bound();
moveTo(get(vector));
//vector->set_add_zoom(1);
vector->set_add_scroll(0, 0);
WindowManager::redraw_window(rect(0, 0, getmaxx(),
getmaxy()));
if(!vector->get_error())
{
to_buffer();
print->set_type(form->p_t);
print->set_density(form->d);
print->set_pass(form->pas);
print->set_comp(form->m_x, form->m_y, form->d_x, form->d_y);
print->set_left(form->l);
print->set_paper(form->pap);
for(int cop = 0; cop < form->cop && !vector->get_error();
cop++)
{
print->draw_pages(buffer, "_work1.buf");
if(form->pap && getch() == 27) // Wait for char - you could
break; // insert new paper
}
buffer->b_close();
delete buffer;
buffer = NULL;
}
WindowManager::redraw_window(tmp);
moveTo(1);
menu->show();
return 0;
case AC_NEW: // Load empty program file.
editor->unload_file();
editor->set_swap("noname.vec");
editor->set_header("noname.vec");
editor->show();
return 1; // Hide menu.
case AC_OPEN:
prepare_files();
(file_sys->edit)->put_string("*.vec");
DATA_FILE = FILE_OPEN;
return 2;
case AC_SAVE:
prepare_files();
(file_sys->edit)->put_string("*.vec");
DATA_FILE = FILE_SAVE;
return 2;
case AC_SAVE_AS_PCX:
prepare_files();
(file_sys->edit)->put_string("*.pcx");
DATA_FILE = FILE_SAVE_AS_PCX;
return 2;
case AC_SAVE_AS_PCX_BW:
prepare_files();
(file_sys->edit)->put_string("*.pcx");
DATA_FILE = FILE_SAVE_AS_PCX_BW;
return 2;
case AC_ABOUT:
about();
return 1;
case AC_SCRIPT_PLAY:
DATA_FILE = SCRIPT_PLAY;
prepare_files();
(file_sys->edit)->put_string("*.sc"); // set mask for file system
return 2;
case AC_SCRIPT_RECORD: // recording of script
prepare_files();
DATA_FILE = SCRIPT_RECORD;
(file_sys->edit)->put_string("*.sc");
return 2;
case AC_SCRIPT_END: // end of script recording.
DATA_FILE = SCRIPT_END;
file_refresh();
return 1;
case AC_MACROS_KEEP:
DATA_FILE = MACROS_KEEP;
if(scriptMode == PLAY)
{
scriptMode = GO;
return 1;
}
file_refresh();
prepare_files();
(file_sys->edit)->put_string("*.sc");
return 2;
case AC_PROGRAM_EDIT:
return 2;
case AC_PROGRAM_SAVE_AND_RUN:
editor->swap();
reload();
vector->show();
sound(100); delay(100); nosound(); // I want some beeps
return 0;
case AC_PROGRAM_RUN:
reload();
vector->show();
sound(100); delay(100); nosound(); // I want some beeps
return 0;
// Exit program.
case AC_ASK_EXIT:
return ask_exit();
case AC_FILE:
switch(DATA_FILE)
{
case SCRIPT_PLAY: // PLAY mode
WindowManager::hide_window(); // Hide file_sys
WindowManager::hide_window(); // Hide file_menu
mac_status mac; // remember old file executed
mac.file = scriptFileName
? strdup(scriptFileName) : NULL;
mac.ptr = scriptPtr;
mac.mode = scriptMode;
fpos_t reserv_pos;
fgetpos(scriptPtr, &reserv_pos);
mac.pos = reserv_pos;
macros_push(mac); // keep it in the stack
delete scriptFileName;
scriptFileName = global[global_i[1]] // if file name
? strdup(global[global_i[1]]) : NULL; // is set
fclose(scriptPtr);
fclose(macrosPtr);
scriptPtr = fopen(scriptFileName, "r");
macrosPtr = fopen(macrosFileName, "r");
scriptMode = PLAY;
moveTo(1);
return 0;
case SCRIPT_RECORD: // RECORD
WindowManager::hide_window(); // Hide file_sys
WindowManager::hide_window(); // Hide file_menu
delete scriptFileName;
scriptFileName = global[global_i[1]]
? strdup(global[global_i[1]]) : NULL;
scriptPtr = fopen(scriptFileName, "w+");
scriptMode = RECORD;
moveTo(1);
return 0;
case SCRIPT_END:
WindowManager::hide_window(); // Hide file_sys
WindowManager::hide_window(); // Hide file_menu
scriptMode = GO;
fclose(scriptPtr);
moveTo(1);
return 0;
case MACROS_KEEP: // KEEP SCRIPT AS MACROS
WindowManager::hide_window(); // Hide file_sys
WindowManager::hide_window(); // Hide file_menu
int hot_result = ask_hot_key(); // (and end record before)
if(!hot_result) // ESC or mouse button pressed
return 0;
scriptFileName = global[global_i[1]]
? strdup(global[global_i[1]]) : NULL;
fclose(scriptPtr);
fclose(macrosPtr);
scriptPtr = fopen(scriptFileName, "r");
macrosPtr = fopen(macrosFileName, "r");
FILE* tempPtr = fopen("temp.sc", "w"); // temp file for
// duplication
char command[22];
get_command(command); // transfer e.key, set by ask_hot_key to command
add_macros(command, tempPtr); // add the macros
fclose(tempPtr);
fclose(macrosPtr);
unlink(macrosFileName); // new macros file
rename("temp.sc", macrosFileName);
macrosPtr = fopen(macrosFileName, "r");
init_macros(); // rebuild table of macroses
delete scriptFileName;
scriptFileName = NULL;
moveTo(1);
return 0;
case FILE_OPEN:
editor->unload_file();
editor->set_swap(global[global_i[1]]);
editor->set_header(global[global_i[1]]);
WindowManager::hide_window(); // Hide file_sys
WindowManager::hide_window(); // Hide file_menu
editor->show();
moveTo(get(editor));
return 0;
case FILE_SAVE:
editor->set_swap(global[global_i[1]]);
editor->set_header(global[global_i[1]]);
WindowManager::hide_window(); // Hide file_sys
WindowManager::hide_window(); // Hide file_menu
editor->swap();
editor->show();
moveTo(1);
return 0;
case FILE_SAVE_AS_PCX:
case FILE_SAVE_AS_PCX_BW:
editor->swap();
reload();
WindowManager::hide_window(); // Hide file_sys
WindowManager::hide_window(); // Hide file_menu
rect tmp = vector->user_screen();
moveTo(get(vector));
// vector->set_add_zoom(loc(1, 1));
vector->set_add_scroll(0, 0);
WindowManager::redraw_window(rect(0, 0, getmaxx(),
getmaxy()));
if(setup->w <= getmaxx() && setup->h <= getmaxy())
{
if(DATA_FILE == FILE_SAVE_AS_PCX)
pcx_scr_file(vector->user_screen(),
global[global_i[1]], 1);
else
{
pcx_scr_file(vector->user_screen(),
"tmp_0000.pcx", 1);
pcx_col_to_bw("tmp_0000.pcx", global[global_i[1]]);
unlink("tmp_0000.pcx");
}
}
else
{
if(!vector->get_error())
{
to_buffer();
if(DATA_FILE == FILE_SAVE_AS_PCX)
{
buffer->pcx_buffer_file(rect(0, 0,
(buffer->buf_dim.X - 1) / 8 * 8 - 1,
buffer->buf_dim.Y - 1),
global[global_i[1]]);
buffer->b_close();
}
else
{
buffer->pcx_buffer_file(rect(0, 0,
(buffer->buf_dim.X - 1) / 8 * 8 - 1,
buffer->buf_dim.Y - 1),
"tmp_0000.pcx");
buffer->b_close();
pcx_col_to_bw("tmp_0000.pcx", global[global_i[1]]);
unlink("tmp_0000.pcx");
}
delete buffer;
buffer = NULL;
}
}
WindowManager::redraw_window(tmp);
moveTo(1);
return 0;
default:
return 0;
}
default:
return 0;
}
}
//////////////////////